package com.whately.core.database.db;

import lombok.extern.slf4j.Slf4j;

/**
 * 多线程访问全局变量的问题
 */
@Slf4j
public class DynamicDataSourceContextHolder {

    /**
     * 作者：微信公众号JavaQ
     * 链接：https://www.nowcoder.com/discuss/69456
     * 来源：牛客网
     *
     * 解决办法是每次使用完ThreadLocal都调用它的remove()方法清除数据，
     * 或者按照JDK建议将ThreadLocal变量定义成private static，
     * 这样就一直存在ThreadLocal的强引用，
     * 也就能保证任何时候都能通过ThreadLocal的弱引用访问到Entry的value值，进而清除掉。
     */
    private static final ThreadLocal<String> currentDatesource = new ThreadLocal<>();

    /**
     * 清除当前数据源
     */
    public static void clear() {
        currentDatesource.remove();
    }

    /**
     * 获取当前使用的数据源
     *
     * @return 当前使用数据源的ID
     */
    public static String get() {
        return currentDatesource.get();
    }

    /**
     * 设置当前使用的数据源
     *
     * @param value 需要设置的数据源ID
     */
    public static void set(String value) {
        currentDatesource.set(value);
    }

}
